package au.com.acpfg.misc.jemboss.settings; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.JComponent; import javax.swing.JList; import javax.swing.JScrollPane; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.knime.core.data.DataCell; import org.knime.core.data.DataColumnSpec; import org.knime.core.data.DataTableSpec; import org.knime.core.data.DataType; import org.knime.core.node.BufferedDataContainer; import org.knime.core.node.InvalidSettingsException; import au.com.acpfg.misc.jemboss.local.AbstractTableMapper; import au.com.acpfg.misc.jemboss.local.ProgramSettingsListener; /** * Provides a setting which permits the user to select a single value from a list * @author andrew.cassin * */ public class ListSetting extends ProgramSetting { private String m_list_items; private String m_val; public ListSetting(HashMap<String,String> attrs) { super(attrs); if (attrs.containsKey("current-selection")) { m_val = attrs.get("current-selection"); } else { m_val = getDefaultValue(); } setListItems(attrs); } protected void setListItems(HashMap<String,String> attrs) { // ACD parser called us? if (attrs.containsKey("list-values")) { Pattern p2 = Pattern.compile("\\s*\"([^\"]+?)\""); Matcher m2 = p2.matcher(attrs.get("list-values")); if (m2.find()) { m_list_items = m2.group(1); } } else { assert(attrs.containsKey("list-items")); m_list_items = attrs.get("list-items"); } } @Override public String getColumnName() { return null; } @Override public JComponent make_widget(DataTableSpec dt) { // TODO: support list selection min & max values (and default selection) String[] values = m_list_items.split("[\\;,]"); for (int i=0; i<values.length; i++) { values[i] = values[i].replaceAll("\\s\\s+", " ").trim(); } JList jl = new JList(values); jl.addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent arg0) { m_val = ((JList)arg0.getSource()).getSelectedValue().toString(); } }); jl.setSelectedIndex(0); return new JScrollPane(jl); } @Override public void copy_attributes(HashMap<String,String> attrs) { super.copy_attributes(attrs); attrs.put("list-items", m_list_items); attrs.put("current-selection", m_val); } protected void setValue(String new_val) { m_val = new_val; } protected String getSelectedValue() { return m_val; } @Override public void getArguments(ProgramSettingsListener l) throws InvalidSettingsException { String t = getType(); if (t.equals("list")) { int idx = m_val.indexOf(':'); if (idx < 1) { throw new InvalidSettingsException("Cannot find list value for "+getName()+": "+m_val ); } String val = m_val.substring(0, idx); l.addArgument(this, new String[] {"-"+getName(), val}); } } @Override public void marshal(String id, DataCell c, PrintWriter fw) throws IOException, InvalidSettingsException { // TODO Auto-generated method stub } public static boolean canEmboss(String acd_type) { if (acd_type.equals("list") || acd_type.equals("selection")) return true; return false; } }